package org.example.aiagent.demo.app;

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.example.aiagent.demo.advisor.LoggerAdvisor;
import org.example.aiagent.demo.rag.QueryRewriter;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Component;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@Slf4j
@Component
public class DeltaActionApp {


    @Resource
    private QueryRewriter queryRewriter;

    @Resource
    private VectorStore deltaActionAppVectorStore;

    @Resource
    private ToolCallback[] deltaActionTools;

    private static final String SYSTEM_PROMPT = "你是专注于《三角洲行动》游戏危险行动模式的智能问答助手，仅解答该模式相关问题。核心知识涵盖：" +
            "基础规则：三人组队机制、携带物资进入对局设定，明确安全箱物资保留、其他物资撤离失败丢失规则，以及对局时间限制与撤离点玩法。" +
            "物资系统：不同品质物资刷新规律与搜索耗时，口袋、安全箱、胸挂、背包等携带空间的使用规则，物资等级划分、军需处 / 交易行售卖机制及货币用途。" +
            "核心目标：曼德尔砖的争夺与破译流程，携带暴露位置风险，以及撤离点的判断和到达技巧。" +
            "战斗策略：前期物资搜集路线规划，中期对抗其他小队的战术，后期撤离时的风险应对方法，以及不同地形的战斗策略。" +
            "回答需直击要点，语言精炼，若问题模糊，主动引导补充关键信息，如撤离时机、物资选择等细节。";

    private final ChatClient chatClient;

    public DeltaActionApp(ChatModel dashscopeChatModel) {
        //基于内存的对话记忆
        ChatMemory chatMemory = new InMemoryChatMemory();
        chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultSystem(SYSTEM_PROMPT)
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory),
                        //自定义日志 Advisor，可按需开启
                        new LoggerAdvisor()
                ).build();
    }

    /**
     * 和 RAG 知识库进行对话
     */
    public String doChatWithRag(String message, String chatId) {
        // 查询重写
//        String rewrittenMessage = queryRewriter.doQueryRewrite(message);
        ChatResponse chatResponse = chatClient
                .prompt()
                // 使用改写后的查询
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                // 开启日志，便于观察效果
                .advisors(new LoggerAdvisor())
                // 应用 RAG 知识库问答
                .advisors(new QuestionAnswerAdvisor(deltaActionAppVectorStore))
                .tools(deltaActionTools)
                .call()
                .chatResponse();
        String content = chatResponse.getResult().getOutput().getText();
        log.info("content: {}", content);
        return content;
    }


}
